//#include <iostream>
//#include <vector>
//#include <queue>
//#include <cstring>
//using namespace std;
//
//const int N = 1e5 + 10;
//
//int n;
//int a[N] = { 0 };
//bool st[N] = { 0 };
//vector<int> edges[N];
//
//int bfs(int x)
//{
//	memset(st, 0, sizeof(st));
//	queue<pair<int, int>> q;
//	q.push({ x, 1 });
//	st[x] = 1;
//	int cnt = 1;
//	int ret = 0;
//
//	while (q.size())
//	{
//		auto t = q.front();
//		q.pop();
//		int num = t.first;
//		int s = t.second;
//
//		for (auto ch : edges[num])
//		{
//			if (st[ch] == 0)
//			{
//				ret += s * a[ch];
//				q.push({ ch, s + 1 });
//				st[ch] = 1;
//			}
//			
//		}
//	}
//
//	return ret;
//}
//
//int main()
//{
//	cin >> n;
//	for (int i = 1; i <= n; i++)
//	{
//		int x, y;
//		cin >> a[i] >> x >> y;
//		if (x != 0)
//		{
//			edges[x].push_back(i);
//			edges[i].push_back(x);
//		}
//		if (y != 0)
//		{
//			edges[y].push_back(i);
//			edges[i].push_back(y);
//		}
//
//	}
//
//	int ans = 0x3f3f3f3f;
//	for (int i = 1; i <= n; i++)
//	{
//		ans = min(bfs(i), ans);
//	}
//
//	cout << ans << endl;
//
//	return 0;
//}
//



//#include <iostream>
//#include <cstring>
//using namespace std;
//
//const int N = 1e4 + 10;
//
//int n, m;
//int a[N] = { 0 };
//int f[1010][N] = { 0 };
//
//int main()
//{
//	cin >> n >> m;
//	for (int i = 1; i <= n; i++)
//	{
//		cin >> a[i];
//	}
//
//	memset(f, 0x3f, sizeof(f));
//	for (int i = 0; i <= n; i++)
//	{
//		f[i][0] = 0;
//	}
//
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = 0; j <= m; j++)
//		{
//			f[i][j] = f[i - 1][j];
//			if (j >= a[i])
//			{
//				f[i][j] = min(f[i][j], f[i][j - a[i]] + 1);
//			}
//		}
//	}
//
//	cout << f[n][m] << endl;
//
//
//	return 0;
//}

//#include <iostream>
//using namespace std;
//
//const int N = 1e4 + 10;
//
//int n, m;
//int a[N] = { 0 };
//int f[N][N] = { 0 };
//
//int main()
//{
//	cin >> n >> m;
//	for (int i = 1; i <= n; i++)
//	{
//		cin >> a[i];
//	}
//
//	f[0][0] = 1;
//
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = 0; j <= m; j++)
//		{
//			f[i][j] += f[i - 1][j];
//			if (j >= a[i])
//			{
//				f[i][j] += f[i][j - a[i]];
//			}
//		}
//	}
//
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = 0; j <= m; j++)
//		{
//			cout << f[i][j] << " ";
//		}
//		cout << endl;
//	}
//
//
//	cout << f[n][m] << endl;
//
//	return 0;
//}


//#include <iostream>
//using namespace std;
//
//typedef long long ll;
//
//ll t, a;
//
//ll gcd(ll a, ll b)
//{
//	if (b == 0)
//		return a;
//
//	return gcd(b, a % b);
//}
//
//int main()
//{
//	cin >> t;
//	while (t--)
//	{
//		cin >> a;
//		if (a == 1)
//			cout << 1 << endl;
//		else
//			cout << a * (a - 1) << endl;
//	}
//	return 0;
//}



//#include <iostream>
//#include <cstring>
//using namespace std;
//
//const int N = 1510;
//
//int dx[] = { 0, 0, -1, 1 };
//int dy[] = { 1, -1, 0, 0 };
//
//int n, m;
//int x1, my_y1;
//
//char g[N][N] = { 0 };
//bool st[N][N] = { 0 };
//int prex[N][N] = { 0 };
//int prey[N][N] = { 0 };
//
//bool dfs(int x, int y)
//{
//	int i = (x % n + n) % n;
//	int j = (y % m + m) % m;
//
//	if (st[i][j] && (prex[i][j] != x || prey[i][j] != y))
//		return true;
//	if (st[i][j] && prex[i][j] == x && prey[i][j] == y)
//		return false;
//
//	st[i][j] = 1;
//	prex[i][j] = x;
//	prey[i][j] = y;
//
//	for (int k = 0; k < 4; k++)
//	{
//		int xx = x + dx[k];
//		int yy = y + dy[k];
//		int pa = (xx % n + n) % n;
//		int pb = (yy % m + m) % m;
//
//		if (g[pa][pb] == '#')
//			continue;
//
//		if (dfs(xx, yy))
//			return true;
//	}
//
//	return false;
//}
//
//int main()
//{
//	while (cin >> n >> m)
//	{
//		memset(st, 0, sizeof(st));
//		memset(prex, 0, sizeof(prex));
//		memset(prey, 0, sizeof(prey));
//
//		for (int i = 0; i < n; i++)
//		{
//			for (int j = 0; j < m; j++)
//			{
//				cin >> g[i][j];
//				if (g[i][j] == 'S')
//				{
//					x1 = i;
//					my_y1 = j;
//				}
//			}
//		}
//
//		if (dfs(x1, my_y1))
//			cout << "Yes" << endl;
//		else
//			cout << "No" << endl;
//
//	}
//
//	return 0;
//}


//#include <iostream>
//#include <unordered_map>
//using namespace std;
//
//int n;
//bool a[5][15] = { 0 };
//
//int main()
//{
//	cin >> n;
//	for (int i = 1; i <= n; i++)
//	{
//		char x, y;
//		cin >> x >> y;
//	
//		int p = 0;
//		int q = 0;
//		if (x == 'D')
//		{
//			p = 1;
//		}
//		else if (x == 'C')
//		{
//			p = 2;
//		}
//		else if (x == 'S')
//		{
//			p = 3;
//		}
//		else if (x == 'H')
//		{
//			p = 4;
//		}
//
//		if (y >= '2' && y <= '9')
//		{
//			q = y - '0';
//		}
//		else if (y == 'A')
//		{
//			q = 1;
//		}
//		else if (y == 'T')
//		{
//			q = 10;
//		}
//		else if (y == 'J')
//		{
//			q = 11;
//		}
//		else if (y == 'Q')
//		{
//			q = 12;
//		}
//		else if (y == 'K')
//		{
//			q = 13;
//		}
//
//		a[p][q] = 1;
//
//	}
//
//	int cnt = 0;
//	for (int i = 1; i <= 4; i++)
//	{
//		for (int j = 1; j <= 13; j++)
//		{
//			if(a[i][j])
//				cnt++;
//		}
//	}
//
//	cout << 52 - cnt << endl;
//
//	return 0;
//}



//#include <iostream>
//using namespace std;
//
//typedef long long ll;
//
//const int N = 1e5 + 10;
//
//ll n, k;
//ll a[N] = { 0 };
//
//ll check(ll x)
//{
//	ll ret = 0;
//	ll sum = 0;
//	for (int i = 1; i <= n; i++)
//	{
//		sum += a[i];
//		if (sum >= x)
//		{
//			ret++;
//			sum = 0;
//		}
//		else if (sum < 0)
//		{
//			sum = 0;
//		}
//	}
//
//	return ret;
//}
//
//int main()
//{
//	cin >> n >> k;
//	for (int i = 1; i <= n; i++)
//	{
//		cin >> a[i];
//	}
//
//	ll l = 1;
//	ll r = 1e18;
//	
//	while (l < r)
//	{
//		ll mid = (l + r) / 2;
//		if (check(mid) > k)
//		{
//			l = mid + 1;
//		}
//		else
//		{
//			r = mid;
//		}
//	}
//	ll minret = l;
//
//	if (check(l) != k)
//	{
//		cout << -1 << endl;
//		return 0;
//	}
//
//	l = 1;
//	r = 1e18;
//
//	while (l < r)
//	{
//		ll mid = (l + r + 1) / 2;
//		if (check(mid) >= k)
//		{
//			l = mid;
//		}
//		else
//		{
//			r = mid - 1;
//		}
//	}
//	ll maxret = l;
//
//	cout << minret << " " << maxret << endl;
//
//	return 0;
//}


#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;

const int N = 510;

int t, n, m, w;
bool st[N];
int cnt[N];
int dist[N];
vector<pair<int, int>> edges[N];

bool spfa()
{
	memset(st, 0, sizeof(st));
	memset(dist, 0x3f, sizeof(dist));
	memset(cnt, 0, sizeof(cnt));

	queue<int> q;
	for (int i = 1; i <= n; i++)
	{
		q.push(i);
		dist[i] = 0;
		st[i] = 1;
	}

	while (q.size())
	{
		auto a = q.front();
		q.pop();
		st[a] = 0;

		for (auto ch : edges[a])
		{
			int w = ch.first;
			int b = ch.second;

			if (dist[b] > dist[a] + w)
			{
				dist[b] = dist[a] + w;
				cnt[b]++;
				if (cnt[b] == 2)
					return true;

				if (st[b] == 0)
				{
					q.push(b);
				}
			}
		}
	}

	return false;
}

int main()
{
	cin >> t;
	while (t--)
	{
		cin >> n >> m >> w;

		for (int i = 1; i <= n; i++)
		{
			edges[i].clear();
		}

		for (int i = 1; i <= m; i++)
		{
			int a, b, c;
			cin >> a >> b >> c;
			edges[a].push_back({ c, b });
			edges[b].push_back({ c, a });
		}

		for (int i = 1; i <= w; i++)
		{
			int a, b, c;
			cin >> a >> b >> c;
			edges[a].push_back({ -c, b });
		}

		if (spfa())
			cout << "YES" << endl;
		else
			cout << "NO" << endl;
	}
	return 0;
}

